查找数组中是否存在任意三个数可组成三角形的算法

分治法:

先把数组一a[i]为界,分成两部分,左边比a[i]小,右边比a[i]大。

接下来问题就变成了两个子问题,左右两个子数组,再加上一下这三种情况:

1:左面数组去一个数、右面数组取一个数,a[i]三个数判断;

2:左面取两个数与a[i]判断;

3:右面取两个数与a[i]判断;

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

void swap(int *a,int *b){
    int c=*a;
    *a=*b;    
    *b=c;
}
int valid(int a,int b,int c)
{
    return a+b>c && a+c>b && b+c>a;
}
int partion(int * a,int p,int q)//快排
{
    int i,j;
    for(i = p-1,j = p;j<q;++j)
    {
        if(a[j] < a[q] && a[++i]> a[q])//i——j之间的值为大于a[q]的值,i以前的都是比a[q]的值小的值。
            swap(&a[i],&a[j]);
    }
    swap(&a[i+1],&a[q]);
    return i+1;
}
int subtri(int * a,int p,int q)
{
    int mid;
    if(q-p+1 < 3)return 0;
        mid = partion(a,p,q);
    if(subtri(a,p,mid-1)||subtri(a,mid+1,q))return 1;
    else
    {
        int l,r;
        for(l = p;l<mid;l++)
            for(r = mid+1;r <= q;++r)
            {
                if(valid(a[r],a[l],a[mid]))return 1;
            }
        for(l = p;l<mid;l++)
            for(r = p;r<mid;r++)
            {
                if(r != l && valid(a[r],a[l],a[mid]))return 1;
            }
        for(l = mid+1;l<=q;l++)
            for(r = mid+1;r<=1;r++)
            {
                if(r != l && valid(a[r],a[l],a[mid]))return 1;
            }
    }
    return 0;
}
int main()
{
    int a[] = {4,4,1,2,3,5,7,8,9};
    printf("%d",subtri(a,0,8));
    return 0;
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值